const chalk = require('chalk');

module.exports = opt => {

  return async function errorHandler(ctx, next) {

    console.log(chalk.blue.bgRed.bold('errorHandler middleware'));


    try {
      await next();
    } catch (err) {

      // 通过  this.ctx.throw(500, 'remote response error', { data: result.data }); 都会进入到该中间件中
      console.log('🐯🐯🐯 ~ file: error_handler.js:14 ~ errorHandler ~ err：', err);

      // 所有的异常都会触发 app 上的一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);

      const status = err.status || 500;
      // 在生产环境中，500 错误的详细内容不返回给客户端，因为可能含有敏感信息
      const error = status === 500 && ctx.app.config.env === 'prod'
        ? 'Internal Server Error'
        : err.message;

      // 从 error 对象读出各属性，设置到响应中
      ctx.body = { error };

      if (status === 422) {
        // 一般是 header 错误
        ctx.body.detail = err.errors;
      }
      ctx.status = status;
    }
  };
};
